# -*- coding: utf-8 -*-

import cv2 as cv
import numpy as np

img = cv.imread("photos/dog.jpg")
cv.imshow("Dog", img)

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("Gray", gray)

# Laplace 拉普拉斯

# Laplacian算子是n维欧几里得空间中的一个二阶微分算子。它通过加上sobel算子运算出的图像x方向和y方向上的导数，
# 来得到我们载入图像的拉普拉斯变换结果。
# ddepth:图像的颜色深度
lap = cv.Laplacian(gray, ddepth=cv.CV_64F)
lap = np.uint8(np.absolue(lap))
cv.imshow("Laplacian", lap)

# Sobel

# Sobel算子是一个主要用于边缘检测的离散微分算子，它结合高斯平滑和微分求导。用来计算灰度图像的近似函数。
# ddepth:图像的颜色深度
# dx:表示x方向的差分阶数，1或0
# dy:表示y方向的差分阶数，1或0
sobelx = cv.Sobel(gray, ddepth=cv.CV_64F, dx=1, dy=0)
sobely = cv.Sobel(gray, ddepth=cv.CV_64F, dx=0, dy=1)

cv.imshow("Sobel X", sobelx)
cv.imshow("Sobel Y", sobely)

combined_sobel = cv.bitwise_or(sobelx, sobely)
cv.imshow("Combined Sobel", combined_sobel)

# Canny

# Canny算子是John F.Canny于1986年开发出来的一个多级边缘检测算法
canny = cv.Canny(gray, 125, 175)
cv.imshow("Canny", canny)

cv.waitKey(0)